package com.wuage.infrastructure.status;

import com.wuage.infrastructure.exception.BizException;
import com.wuage.infrastructure.exception.ResultCode;

import java.util.Arrays;

/**
 * 错误信息枚举
 * <p>
 * 注意！！注意！！注意！！
 * 自定义错误枚举请参考下列例子
 * 错误码请按照 范围编写:(错误码 5 位数)
 *
 * @author shynin
 */
public enum BizResultCode implements ResultCode {


    /**
     * 登录相关错误
     */
    LOGIN_ERROR(100, "登录失败，用户名密码错误"),
    USER_NOT_EXISTS(101, "该用户还未在系统中存在"),
    UN_LOGIN(102, "未登录"),
    NOT_PERMISSION(103, "没有权限"),
    ACCOUNT_EXCEPTION(104, "账户信息异常，请联系管理员"),
    OPERATION_DATABASE_ERROR(110, "操作数据库失败"),
    USER_EXISTS(104, "该用户已经存在，不能重复注册"),
    EMAIL_CHECKED(106, "邮箱已经验证，无需重复验证"),
    JWT_ERROR(105, "Token无效或Token错误"),


    /**
     * 请求相关错误
     */
    VERIFICATION_ERROR(201, "请求参数校验失败"),
    NOT_READABLE_ERROR(202, "请求参数反序列失败,请检查数据格式"),
    NOT_OPERATION_ERROR(203, "无相关操作"),
    PASSWORD_IS_NOT_SAME(204, "确认密码和密码不一样"),
    AUTH_CODE_ERROR(205, "验证码有误"),
    ROLE_ERROR(206, "角色信息错误"),
    /**
     * 重试失败
     */
    RETRY_ERROR(301, "重试失败"),
    TIME_FORMAT_ERROR(302, "时间格式错误"),
    DATA_NOT_FIND(303, "为找到对应信息"),


    /**
     * 系统相关
     */
    SYSTEM_ERROR(500, "系统错误"),
    PARAM_ERROR(501, "参数错误"),
    UPLOAD_ERROR(510, "上传失败"),
    REDIS_ERROR(550, "redis相关操作报错，请联系管理员"),
    /**
     * 工具类错误
     */
    UTIL_REGEX_DATE_FORMAT_ERROR(1001, "日期格式不正确(格式为:yyyy-MM)"),

    /**
     * 权限相关
     */
    ROLE_NOT_HAS_PERMISSION(1100, "当前登录用户没有权限赋予其他角色权限"),
    ROLE_NOT_HAS_THAT_PERMISSION(1101, "当前登录用户没有全新啊赋予某个权限"),
    ROLE_CODE_EXIST(1102, "该角色编码已存在"),
    INVALID_ROLE_CODE(1103, "无效的角色编码，不能为ADMIN、SUPER_ADMIN"),


    /**
     * 文件相关错误
     */
    FILE_NOT_FOUND(30001, "文件不存在!"),
    FILE_IS_EXISTS(30002, "文件已存在!"),
    FILE_UPLOAD_ERROR(30003, "文件上传失败!"),
    CRT_ANALYSIS_ERROR(30004, "解析crt失败"),

    ;


    BizResultCode(Integer code, String desc) {
        this.desc = desc;
        this.code = code;
    }

    private String desc;
    private Integer code;

    @Override
    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    /**
     * 通过错误码获取枚举实例
     *
     * @param code 错误码
     * @return 枚举实例
     */
    public static BizResultCode getType(Integer code) {
        return Arrays.stream(BizResultCode.values()).filter(status -> status.getCode().equals(code)).findFirst()
                .orElseThrow(() -> new BizException(400, "匹配不到正确的类型信息"));
    }
}
